/**
 * 实现了iterable接口的内置对象
 * 字符串
 * 列表（数组）
 * 映射（map）
 * 集合（set）
 * arguments对象
 * nodelist对象
 * 
 * 
 */


//检查是否存在Symbol.iterator属性（迭代器属性）

let num = 10;
let obj = {};

//没有Symbol.iterator属性
console.log(num[Symbol.iterator]);//undefined
console.log(obj[Symbol.iterator]);//undefined

//有Symbol.iterator属性
let arr = [1,2,3];
let str = 'abc';
let map = new Map().set('a',1).set('b',2).set('c',3);
let set = new Set().add(1).add(2).add(3);
//let els = document.querySelectorAll('div');


console.log(arr[Symbol.iterator]);//[Function: values]
console.log(str[Symbol.iterator]);//[Function: [Symbol.iterator]]
console.log(map[Symbol.iterator]);//[Function: entries]
console.log(set[Symbol.iterator]);//[Function: values]
//console.log(els[Symbol.iterator]);

//可迭代协议 (使用方法)

//数组解构
let arr2 = ['aa','bb','cc'];
let [a,b,c] = arr2;
console.log(a,b,c);//aa bb cc

//扩展符
let arr3 = ['aa','bb','cc'];
let [a1,...b1] = arr3;
console.log(a1,b1);//aa ["bb","cc"]

//set构造函数
let set2 = new Set(arr3);
console.log(set2);//Set(3) { 'aa', 'bb', 'cc' }

//map构造函数
let pairs = arr3.map((item,index)=>[index,item]);
console.log(pairs);//[ [ 0, 'aa' ], [ 1, 'bb' ], [ 2, 'cc' ] ]

let map2 = new Map(pairs);
console.log(map2);//Map(3) { 0 => 'aa', 1 => 'bb', 2 => 'cc' }
